const moment = require('moment');
const { Base64 } = require('js-base64');

module.exports = {
  /** 格式化时间 */
  formatTime(time) {
    return moment(time).format('YYYY-MM-DD HH:mm:ss');
  },

  /** 处理响应 */
  res({ code = 0, data = null, msg = '请求成功' } = {}) {
    const { ctx } = this;
    ctx.body = { code, data, msg };
    ctx.status = 200;
    ctx.set('Access-Control-Allow-Origin', '*');
  },

  /** 生成token */
  generateToken(params) {
    const data = { ...params, create_time: this.formatTime() };
    return Base64.encode(Base64.encode(JSON.stringify(data)));
  },

  /** 解析token */
  parseToken(token) {
    return JSON.parse(Base64.decode(Base64.decode(token)));
  },

  /** 获取当前用户 */
  getUser() {
    const { ctx } = this;
    const token = ctx.request.body.token;
    if (!token) ctx.throw(402, '未校验身份，请登录');

    const data = this.parseToken(token);
    if (!data.uid) ctx.throw(402, '错误的令牌，请登录');

    return data.uid;
  },

  /**
   * 数据库原始查询
   * @param query sql语句
   * @param json 需要格式化的json字段
   * @param find 是否取列表中的第一项
   */
  async query({ query, json = [], find = false }) {
    const { ctx } = this;
    let res = await ctx.model.query(query);

    res = res[0].map((item) => {
      // 日期格式化
      if (item.create_time) item.create_time = this.formatTime(item.create_time);
      // json格式化
      json.forEach((j) => {
        try {
          item[j] = JSON.parse(item[j]);
        } catch (error) {}
      });
      return item;
    });

    if (find) res = res[0];

    return res;
  },
  /** 数据库事务 */
  async trans(action) {
    const { ctx } = this;

    await ctx.model.query('begin');
    try {
      await action();
    } catch (error) {
      await ctx.model.query('rollback');
    }
    await ctx.model.query('commit');
  },

  /** 随机获取 x~y 之间的一个整数，其中 x 和 y 都是整数。 */
  random(x, y) {
    return Math.round(Math.random() * (y - x) + x);
  }
};
